#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
//#include <SDL/SDL_rotozoom.h>

//~ #include "../inc/affichage.h"
#include "../inc/blob.h"
#include "../inc/deplacement.h"
#include "../inc/collisions.h"
#include "../inc/filet.h"
#include "../inc/Calib.h"
#include "../inc/match.h"


#define UNITE_SAUT 8
#define UNITE_DEP 5
//~ #define DEP_BALLE 15
#define DEP_BALLE 0.055
#define SCORE 10

int main(int argc, char *argv[])
{
	// Initialisation des surfaces
	SDL_Surface *ecran = NULL, *bgImage = NULL,
		*blobIm1 = NULL, *blobIm2 = NULL, *balleIm = NULL,
		*filetIm = NULL,
		*texteScore1 = NULL,*texteScore2 = NULL,
		*Joueur1ok = NULL,*Joueur2ok = NULL;

	// Position de l'arrière-plan
	SDL_Rect bgPosition, positionblobIm1,
		positionblobIm2, positionballeIm,positionfiletIm,
		positionScore1,positionScore2,
		positionTexte1,positionTexte2,
		p1,p2;
	bgPosition.x = 0;
	bgPosition.y = 0;

	SDL_Event event;
	int continuer = 1;

	// Fenetre
	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
	SDL_WM_SetIcon(IMG_Load("../data/pics/icon.png"), NULL);
	SDL_WM_SetCaption("Blobby Kinect", NULL);
	ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
	SDL_EnableKeyRepeat(10, 10);

	// Arriere-plan
	bgImage = IMG_Load("../data/pics/bg_01.png");
	SDL_BlitSurface(bgImage, NULL, ecran, &bgPosition);

	// Sprite blob 1
	blobIm1 = SDL_LoadBMP("../data/pics/blob1.bmp");
	SDL_SetColorKey(blobIm1, SDL_SRCCOLORKEY, SDL_MapRGB(blobIm1->format, 0, 0, 0));
	//~ SDL_SetColorKey(blobIm1, SDL_SRCCOLORKEY, SDL_MapRGB(blobIm1->format, 255, 255, 255));

	// Sprite blob 2
	blobIm2 = SDL_LoadBMP("../data/pics/blob2.bmp");
	SDL_SetColorKey(blobIm2, SDL_SRCCOLORKEY, SDL_MapRGB(blobIm2->format, 0, 0, 0));
	//~ SDL_SetColorKey(blobIm2, SDL_SRCCOLORKEY, SDL_MapRGB(blobIm2->format, 255, 255, 255));

	// Sprite de la balle
	balleIm = IMG_Load("../data/pics/icon.png");
	SDL_SetColorKey(balleIm, SDL_SRCCOLORKEY, SDL_MapRGB(balleIm->format, 255, 255, 255));

	// Sprite du filet
	filetIm = SDL_CreateRGBSurface(SDL_HWSURFACE, 16, ecran->h*5/9, 32, 0, 0, 0, 0);
	SDL_FillRect(filetIm, NULL, SDL_MapRGB(ecran->format, 136, 66, 29));


	// Position texte scores
	positionScore1.x = ecran->w/10;
	positionScore1.y = 20;

	positionScore2.x = ecran->w/2+ecran->w/10;
	positionScore2.y = 20;


	// Position du sprite filet
	positionfiletIm.x = (ecran->w/2)-8;
	positionfiletIm.y = ecran->h*4/9;

	// Positions des blobs
	float x1 = ecran->w / 10;
	float y = ecran->h - ecran->h / 5;
	float x2 = ecran->w - ecran->w / 10;

	// Blobs
	Blob b1(vec2D(x1, y), blobIm1->h, blobIm1->w);
	Blob b2(vec2D(x2, y), blobIm2->h, blobIm2->w);

	Balle balle(vec2D(x1, y - blobIm1->h - balleIm->h - 150), balleIm->w / 2);
	Balle balleSuivante;

	//~ float tpsCour = 0.f;
	//~ float tpsPrec = 0.f;
	//~ float delta = 0.f;

	// Filet
	Filet f(vec2D((ecran->w/2)-8,ecran->h),vec2D((ecran->w/2)+8,ecran->h),vec2D((ecran->w/2)-8,ecran->h*4/9),vec2D((ecran->w/2)+8,ecran->h*4/9));

	// Deplacement
	Deplacement deplacement(0,390,410,800,250,y);

	// Collision
	Collisions collision(balle, f, b1,b2, 800, 600);

	Match match(SCORE);

	// TTF
	TTF_Init();
	TTF_Font *police = NULL;
	police = TTF_OpenFont("../data/angelina.TTF", 65);
	SDL_Color couleurNoire = {0, 0, 0},couleurBlanche = {255, 255, 255};


	char score1[30] = "";
	char score2[30] = "";
	sprintf(score1, "Score 1 : %d", match.getscore1());
	sprintf(score2, "Score 2 : %d", match.getscore2());
	texteScore1 = TTF_RenderText_Shaded(police, "Score 1 :", couleurNoire,couleurBlanche);
	texteScore2 = TTF_RenderText_Shaded(police, "Score 2 :", couleurNoire,couleurBlanche);



	//position des rectangles pour les deux joueurs
	p1.x = (ecran->w / 10) - 50 ;
	p1.y = ecran->h - (ecran->h / 3);
	p1.w = 100;
	p1.h = 125;

	p2.x = ecran->w - (ecran->w / 10) - 50 ;
	p2.y = ecran->h - (ecran->h / 3);
	p2.w = 100;
	p2.h = 125;

	//boucle d'initialisation
	Calib c(bgImage);
	SDL_Rect centre1,centre2;

	centre1.x = 10;
	centre1.y = 400;
	centre2.x = 625;
	centre2.y = 380;
	centre2.w = 10;
	centre2.h = 10;
	centre1.w = 10;
	centre1.h = 10;

	c.drawRect(p1,1,255,29,129);
	c.drawRect(p2,2,129,255,29);

	positionblobIm2.x = b2.getCentre().x-b2.getLargeur()/2.0;
	positionblobIm2.y = b2.getCentre().y-b2.getHauteur()/2.0;
	positionballeIm.x = balle.getCentre().x-balle.getRayon()/2.0;
	positionballeIm.y = balle.getCentre().y-balle.getRayon()/2.0;

	//position texte initialisation
	positionTexte1.x = ecran->w/50;
	positionTexte1.y = 80;
	positionTexte2.x = ecran->w/2 + ecran->w/20;
	positionTexte2.y = 80;

	//affichage texte
	char place1[30] = "";
	char place2[30] = "";
	sprintf(place1, "Joueur 1 \n Placez-vous");
	sprintf(place2, "Joueur 2 \n Placez-vous");
	Joueur1ok = TTF_RenderText_Shaded(police, "Joueur 1 ok !", couleurNoire,couleurBlanche);
	Joueur2ok = TTF_RenderText_Shaded(police, "Joueur 2 ok !", couleurNoire,couleurBlanche);



	// ----- Boucle de calibrage
	while(!c.est_dans_rectangle(centre1.x,centre1.y,1) || !c.est_dans_rectangle(centre2.x,centre2.y,2))
	{
		//compteurs a la zob en attendant les coord kinect
		if(!c.est_dans_rectangle(centre1.x,centre1.y,1))
		{
			centre1.x++;
			centre1.y++;
			sprintf(place1, "J1 Placez-vous");
			SDL_FreeSurface(Joueur1ok);
		}
		else
		{
			sprintf(place1, "J1 en place !");
			SDL_FreeSurface(Joueur1ok);
		}

		//compteurs a la zob en attendant les coord kinect
		if(!c.est_dans_rectangle(centre2.x,centre2.y,2))
		{
			centre2.x++;
			centre2.y++;
			sprintf(place2, "J2 Placez-vous");
			SDL_FreeSurface(Joueur2ok);
		}
		else
		{
			sprintf(place2, "J2 en place !");
			SDL_FreeSurface(Joueur2ok);
		}

		Joueur1ok = TTF_RenderText_Shaded(police, place1, couleurNoire,couleurBlanche);
		Joueur2ok = TTF_RenderText_Shaded(police, place2, couleurNoire,couleurBlanche);
		SDL_SetColorKey(Joueur1ok, SDL_SRCCOLORKEY, SDL_MapRGB(Joueur1ok->format, 255, 255, 255));
		SDL_SetColorKey(Joueur2ok, SDL_SRCCOLORKEY, SDL_MapRGB(Joueur2ok->format, 255, 255, 255));
		//on affiche les centres des joueurs

		//SDL_FillRect(fond, &ligneBas, SDL_MapRGB(fond->format, R, G, B));

		while (SDL_PollEvent(&event))
		{
		  switch(event.type)
			{
			case SDL_QUIT:
			  exit(1);
			  break;
			}
		  break;

		} // Fin while Poll


		SDL_Delay(10);

		// Réaffichage de l'arrière-plan et des sprites
		SDL_BlitSurface(bgImage, NULL, ecran, &bgPosition);

		SDL_BlitSurface(blobIm2, NULL, ecran, &positionblobIm2);
		SDL_BlitSurface(filetIm, NULL, ecran, &positionfiletIm);
		SDL_BlitSurface(Joueur1ok, NULL, ecran, &positionTexte1);
		SDL_BlitSurface(Joueur2ok, NULL, ecran, &positionTexte2);

		SDL_BlitSurface(balleIm, NULL, ecran, &positionballeIm);
		// Mise à jour de l'affichage
		SDL_FillRect(ecran, &centre1, SDL_MapRGB(ecran->format,255,29,129));
		SDL_FillRect(ecran, &centre2, SDL_MapRGB(ecran->format,129, 255,29));
		SDL_Flip(ecran);
	}

	SDL_FreeSurface(bgImage);
	bgImage = IMG_Load("../data/pics/bg_01.png");
	SDL_BlitSurface(bgImage, NULL, ecran, &bgPosition);


	// ----- Boucle principale
	while (continuer)
	{

		if(deplacement.enSaut(b1))
			deplacement.saut(b1, UNITE_SAUT);
		if(deplacement.enSaut(b2))
			deplacement.saut(b2, UNITE_SAUT);

		vec2D normal;
		bool touche_sol=false;
		int joueur=0;


		/// ############################## COLLISIONS

		bool col = false;

		// on met à jour la balle pour calculer la coordonnée suivante
		//~ tpsCour = (float) SDL_GetTicks();
		//~ delta = (tpsCour - tpsPrec) / 1000.f;
		//~ tpsPrec = tpsCour;
		//~ delta *= 1.5f;

		balleSuivante.copy(balle);
		//~ balleSuivante.ajouteForce(deplacement.getGravite());
		deplacement.deplacer(balleSuivante, DEP_BALLE);
		//~ deplacement.deplacer(balleSuivante, delta);

		col = collision.isCollisionBalle(b1.getCentre(),b2.getCentre(),balle.getCentre(),balleSuivante.getCentre(),normal,touche_sol,joueur);

		if(col)
		{
			balle.changeDirection(normal);

			if(touche_sol)
			{
				if(joueur==1)
				{
				    match.ajout2(1);
				    balle.getCentre().x=x2;
				    balle.getCentre().y=y - blobIm1->h - balleIm->h-150;
				    balle.setDirection(vec2D(0,1));
//				    balleSuivante.changeDirection(vec2D(0,1));
				}
				else
				{
				    match.ajout1(1);
				    balle.getCentre().x=x1;
				    balle.getCentre().y=y - blobIm1->h - balleIm->h - 150;
				    balle.setDirection(vec2D(0,1));
//				    balleSuivante.changeDirection(vec2D(0,1));
				}
			}
		}



		/// ############################## FIN COLLISIONS
		balle.ajouteForce(deplacement.getGravite());
		deplacement.deplacer(balle, DEP_BALLE);
		//~ deplacement.deplacer(balle, delta);
//		balle.rebond();
		//~ balle.renvoiBlob(b1);
		//~ balle.renvoiBlob(b2);

		while (SDL_PollEvent(&event))
		{
		  switch(event.type)
			{
			case SDL_QUIT:
			  continuer = 0;
			  break;
			case SDL_KEYDOWN:
			  switch(event.key.keysym.sym)
			{
			  // Joueur 1 (gauche)
			case SDLK_UP: // Flèche haut
			  deplacement.sauter(b1, UNITE_SAUT);
			  break;
			case SDLK_RIGHT: // Flèche droite
			  deplacement.deplacerDroite(b1, UNITE_DEP);
			  break;
			case SDLK_LEFT: // Flèche gauche
			  deplacement.deplacerGauche(b1, UNITE_DEP);
			  break;

			  // Joueur 2 (droite)
			case SDLK_z: // Flèche haut
			  deplacement.sauter(b2, UNITE_SAUT);
			  break;
			case SDLK_d: // Flèche droite
			  deplacement.deplacerDroite(b2, UNITE_DEP);
			  break;
			case SDLK_q: // Flèche gauche
			  deplacement.deplacerGauche(b2, UNITE_DEP);
			  break;
			default:
			  break;
			}
			  break;

			}
		} // Fin while Poll


		//SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

		positionblobIm1.x = b1.getCentre().x-b1.getLargeur()/2.0;
		positionblobIm1.y = b1.getCentre().y-b1.getHauteur()/2.0;
		positionblobIm2.x = b2.getCentre().x-b2.getLargeur()/2.0;
		positionblobIm2.y = b2.getCentre().y-b2.getHauteur()/2.0;
		positionballeIm.x = balle.getCentre().x-balle.getRayon()/2.0;
		positionballeIm.y = balle.getCentre().y-balle.getRayon()/2.0;

		SDL_Delay(5);

		// Réaffichage de l'arrière-plan et des sprites
		SDL_BlitSurface(bgImage, NULL, ecran, &bgPosition);
		SDL_BlitSurface(blobIm1, NULL, ecran, &positionblobIm1);
		SDL_BlitSurface(blobIm2, NULL, ecran, &positionblobIm2);
		SDL_BlitSurface(filetIm, NULL, ecran, &positionfiletIm);

		sprintf(score1, "Score 1 : %d", match.getscore1());
		sprintf(score2, "Score 2 : %d", match.getscore2());

		SDL_FreeSurface(texteScore1); /* On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT) */
		texteScore1 = TTF_RenderText_Shaded(police, score1, couleurNoire,couleurBlanche); /* On écrit la chaine temps dans la SDL_Surface */
		SDL_SetColorKey(texteScore1, SDL_SRCCOLORKEY, SDL_MapRGB(texteScore1->format, 255, 255, 255));

		SDL_FreeSurface(texteScore2); /* On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT) */
		texteScore2 = TTF_RenderText_Shaded(police, score2, couleurNoire,couleurBlanche); /* On écrit la chaine temps dans la SDL_Surface */
		SDL_SetColorKey(texteScore2, SDL_SRCCOLORKEY, SDL_MapRGB(texteScore2->format, 255, 255, 255));


		SDL_BlitSurface(texteScore1, NULL, ecran, &positionScore1);
		SDL_BlitSurface(texteScore2, NULL, ecran, &positionScore2);


		SDL_BlitSurface(balleIm, NULL, ecran, &positionballeIm);


		// Mise à jour de l'affichage
		SDL_Flip(ecran);
    } // Fin while continuer

	// Libère les images
	SDL_FreeSurface(blobIm1);
	SDL_FreeSurface(blobIm2);
	SDL_FreeSurface(bgImage);
	SDL_FreeSurface(balleIm);

	TTF_CloseFont(police);
	TTF_Quit();

	SDL_Quit();

	return EXIT_SUCCESS;
}
